iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 22
0
自我挑戰組

TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我系列 第 22

Day22. 酷炫的兒童黑話 Codewars_Simple Pig Latin

  • 分享至 

  • xImage
  •  

今天的題目超酷的啦(難度:5kyu)
看起來很炫泡,一開始看不懂什麼叫做Pig Latin到底是什麼毛
跑去google就發現他被稱作為兒童黑話
是一種英語語言的遊戲。

有興趣的就來這邊看一下維基百科怎麼解釋唄XD
https://zh.wikipedia.org/wiki/%E5%85%92%E7%AB%A5%E9%BB%91%E8%A9%B1

https://ithelp.ithome.com.tw/upload/images/20180108/20107209STDrOwIHZx.png
很像這個XD

今天的題目長這樣

https://ithelp.ithome.com.tw/upload/images/20180108/20107209GlvGmaVD83.png

今天的題目要去拆解輸入的字串,而每一個被拆解的字串要背去掉頭加在後方,並且再加上ay。

現在就來拆一下題目吧。

  1. 將字串拆解->split方法
  2. 去得字首加上ay方法
  3. 將處理過的字串串起來->Join方法

一開始我們先來寫一個處理字首加上ay的方法吧!!

[TestMethod]
public void PigPart_Input_Empty_Should_Be_Empty()
{
    Assert.AreEqual(string.Empty,Kata.PigPart(string.Empty));
}

而Production Code 也就是老樣子會長成這個樣子

public static string PigPart(string s)
{
    throw new System.NotImplementedException();
}

老樣子,跑個測試,沒過很正常,紅燈,commit一下

接下來把Production Code改一下,用最簡單的方式解決他!

public static string PigPart(string s)
{
    return string.Empty;
}

接下來跑個測試,PASS! Commit~

再來寫處理加上ay字串的測試

[TestMethod]
public void PigPart_Input_a_Should_Be_aay()
{
    Assert.AreEqual("aay", Kata.PigPart("a"));
}

而Production Code就會長這個樣子

public static string PigPart(string s)
{
    if (s.Length > 0)
    {
        return s + "ay";
    }
    return string.Empty;
}

接下來就可以補上字串長度為2的字串測試,就需要處理到字首的問題。

 [TestMethod]
public void PigPart_Input_ab_Should_Be_baay()
{
    Assert.AreEqual("baay", Kata.PigPart("ab"));
}

Production Code就會考慮到處理字首的問題了。

public static string PigPart(string s)
{
    if (s.Length > 0)
    {
        return s.Remove(0, 1) + s[0] + "ay";
    }
    return string.Empty;
}

再來就是重構之後Production Code可以變成的樣子

public static string PigPart(string s)
{
    return s.Length > 0 ? s.Remove(0, 1) + s[0] + "ay" : string.Empty;
}

接下來就要開始寫主要Production Code的測試啦!

 [TestMethod]
public void Input_ab_ba_Should_Be_baay_abay()
{
    Assert.AreEqual("baay abay",Kata.PigIt("ab ba"));
}

這個測試涵蓋的是要將輸入的str用split方法之後使用PigPart方法處理之後再把字串Join起來
所以Production Code 就會長成這個樣子

public static string PigIt(string str)
{
    var splitted = str.Split();
    var result = new List<string>();
    foreach (var s in splitted)
    {
       result.Add(PigPart(s));
    }
    return string.Join(" ", result);

}

然後Production Code可以做Linq的寫法,所以就變成這個樣子

public static string PigIt(string str)
{
    return string.Join(" ", str.Split().Select(PigPart).ToList());
}

以下是所有的Production Code

public class Kata
{
    public static string PigPart(string s)
    {
        return s.Length > 0 ? s.Remove(0, 1) + s[0] + "ay" : string.Empty;
    }

    public static string PigIt(string str)
    {
        return string.Join(" ", str.Split().Select(PigPart).ToList());
    }
}

以下是今天所有的測試案例

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void PigPart_Input_Empty_Should_Be_Empty()
    {
        Assert.AreEqual(string.Empty, Kata.PigPart(string.Empty));
    }

    [TestMethod]
    public void PigPart_Input_a_Should_Be_aay()
    {
        Assert.AreEqual("aay", Kata.PigPart("a"));
    }

    [TestMethod]
    public void PigPart_Input_ab_Should_Be_baay()
    {
        Assert.AreEqual("baay", Kata.PigPart("ab"));
    }

    [TestMethod]
    public void Input_ab_ba_Should_Be_baay_abay()
    {
        Assert.AreEqual("baay abay", Kata.PigIt("ab ba"));
    }

    [TestMethod]
    public void Input_Hello_World_Should_Be_elloHay_orldWay()
    {
        Assert.AreEqual("elloHay orldWay",Kata.PigIt("Hello World"));
    }

https://ithelp.ithome.com.tw/upload/images/20180108/20107209YbK9dyBuvX.png

在Codewars上成功提交了~
來看一下其他人怎麼寫吧!

https://ithelp.ithome.com.tw/upload/images/20180108/201072097n7qKbgLO6.png

第一個人寫得好像就是正規表示式…
小弟我對那個沒研究,覺得很酷XD
或許有時間可以研究一下正規表示法要怎麼使用呢
第二個人寫的則是跟我一樣的邏輯
只是我把它去頭加上ay的方法抽出來了

Git url :
https://github.com/SQZ777/Codewars_SimplePigLatin

Codewars Link:
https://www.codewars.com/kata/simple-pig-latin/train/csharp

下一題,明天見!


上一篇
Day21. 你的餐點,謝謝(?) Codewars_Your Order,Please
下一篇
Day23 這時間你看得懂嗎? Codewars_Human Readable Time
系列文
TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言